/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mx.unam.fciencias.ActividadesCulturales.pages.Actividad;

import mx.unam.fciencias.ActividadesCulturales.pages.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import mx.unam.fciencias.ActividadesCulturales.commons.CatalogoSelectModel;
import mx.unam.fciencias.ActividadesCulturales.services.ServicioActividad;
import mx.unam.fciencias.ActividadesCulturales.services.ServicioEntidadAcademica;
import mx.unam.fciencias.ActividadesCulturales.services.ServicioEspacio;
import mx.unam.fciencias.actividadesculturales.entidades.db.Actividad;
import mx.unam.fciencias.actividadesculturales.entidades.db.EntidadAcademica;
import mx.unam.fciencias.actividadesculturales.entidades.db.Espacio;
import mx.unam.fciencias.actividadesculturales.entidades.portal.UsuarioSistema;
import org.apache.tapestry5.EventContext;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.Service;
import org.apache.tapestry5.annotations.SessionState;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.ioc.annotations.Inject;

/**
 * Página que modifica actividades capturadas.
 * @author lumartin
 */
public class Modificar {

    /** Usuario de sesion y del sistema. */
    @SessionState
    private UsuarioSistema usuario;
    /** Propiedad manejada por la sesion para saber si la sesion del usuario esta activa. */
    private boolean usuarioExists;
    /** Identificador del espacio. */
    private long _espacioId;
    /** Identificador de la entidad academica. */
    private long _entidadAcademicaId;
    /** Propiedad persistente del espacio almacenado para esa actividad. */
    @Property
    @Persist
    private Espacio _espacioAnterior;
    /** Propiedad actividad almacenada en la base de datos. */
    @Property
    private Actividad actividad;
    /** Propiedad espacio */
    @Property
    private Espacio _espacio;
    /** Propiedad entidad academica */
    @Property
    private EntidadAcademica _entidadAcademica;
    /** Propiedad espacios que es utilizada para mostrar los espacios disponibles
     * en forma de campo SELECT de HTML.
     */
    @Property
    private CatalogoSelectModel<Espacio> _espacios;
    /** Propiedad entidadesAcademicas que es utilizada para mostrar las
     * entidades academicas disponibles en forma de campo SELECT de HTML.
     */
    @Property
    private CatalogoSelectModel<EntidadAcademica> _entidadesAcademicas;
    /** Componente formulario utilizado para modificar una actividad. */
    @InjectComponent
    private Form actividadFormModificar;
    /** Inyección de srvicio utilizado para el acceso a datos de actividad. */
    @Inject
    @Service("servicioActividad")
    private ServicioActividad servicioActividad;
    /** Inyección de srvicio utilizado para el acceso a datos de espacio. */
    @Inject
    @Service("servicioEspacio")
    private ServicioEspacio servicioEspacio;
    /** Inyección de srvicio utilizado para el acceso a datos de EntidadAcademica. */
    @Inject
    @Service("servicioEntidadAcademica")
    private ServicioEntidadAcademica servicioEntidadAcademica;

    /**
     * Método que verifica que el usuario pueda modificar.
     * @return verdadero si puede modificar y falso si no puede.
     */
    private boolean usuarioCorrecto() {
        if (!usuarioExists) {
            return false;
        } else {
            if (usuario.puedeEscribir()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Método que se ejecuta cuando se manda a llamar la pagina
     * se cargan los datos almacenados para la actividad a modificar..
     * @param contexto con el id de la actividad a modificar.
     * @return la pagina a redireccionar.
     */
    public Object onActivate(EventContext contexto) {
        if (usuarioCorrecto()) {
         if (contexto.getCount() == 1) {
             try {
                 BigInteger idActividad = contexto.get(BigInteger.class, 0);
                    //_actividadId = idActividad.longValue();
                        actividad = servicioActividad.getById(idActividad.longValue());
                        List<Espacio> espacios = servicioEspacio.getEspacio(null);
                        _espacios = new CatalogoSelectModel<Espacio>(espacios);
                        _espacioAnterior = findEspacioInModel(actividad.getEspacios().get(0).getId());
                        _espacio = _espacioAnterior;
                } catch (Exception e) {
                    return Ver.class;
                }
            }
            return null;
        } else {
            return Index.class;
        }
    }

    /**
     * Trigger del formulario que se ejecuta durante form render y form submission
     * obtiene todos los espacios y las entidades academicas para mostrarlos en la aplicación.
     */
    void onPrepare() {
	List<Espacio> espacios = servicioEspacio.getEspacio(null);
	_espacios = new CatalogoSelectModel<Espacio>(espacios);
        _espacio = findEspacioInModel(_espacioId);

         List<EntidadAcademica> entidadesAcademicas = servicioEntidadAcademica.getTodas();
        _entidadesAcademicas = new CatalogoSelectModel<EntidadAcademica>(entidadesAcademicas);
        _entidadAcademica = findEntidadAcademicaInModel(_entidadAcademicaId);
    }

    /**
     * Se ejecuta si el formulario se llena correctamente y guarda los cambios
     * hechos a la actividad.
     */
    void onValidateForm() {
        List<Espacio> espLst = new ArrayList<Espacio>();
        List<EntidadAcademica> entidadesLst = new ArrayList<EntidadAcademica>();

        espLst.add(_espacio);
        entidadesLst.add(_entidadAcademica);

        actividad.setEspacios(espLst);
        actividad.setEntAcademicas(entidadesLst);

        servicioActividad.guarda(actividad);
    }

    /**
     * Obtiene el espacio seleccionado apartir de su identificador.
     * @param espacioId el identificador del espacio.
     * @return el espacio seleccionado.
     */
    Espacio findEspacioInModel(Long espacioId) {
	for (Espacio espacio : _espacios.getList()) {
		if (espacio.getId() == espacioId) {
			return espacio;
		}
	}
	return null;
    }

    /**
     * Obtiene la entidad academica seleccionada apartir de su identificador.
     * @param entidadAcademicaId el identificador de la entidad academica.
     * @return la entidad academica seleccionada.
     */
    EntidadAcademica findEntidadAcademicaInModel(Long entidadAcademicaId) {
	for (EntidadAcademica entidadAcademica : _entidadesAcademicas.getList()) {
		if (entidadAcademica.getId() == entidadAcademicaId) {
			return entidadAcademica;
		}
	}
	return null;
    }

    /**
     * Se ejecuta despues del metodo onValidateForm()
     * @return la pagina a redireccionar.
     */
    Object onSuccess() {
        return Ver.class;
    }

}
